package online.model.session;

import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * セション共通情報
 *
 * @author Tadashi Nakayama
 * @version 1.0.0
 */
public final class SessionUser implements Serializable {
	/** serialVersionUID */
	private static final long serialVersionUID = 1152688173483661135L;

	/** ユーザID */
	private final String id;
	/** ユーザ属性 */
	private final Map<String, String> attribute = new HashMap<>();

	/**
	 * コンストラクタ
	 *
	 * @param uid ユーザID
	 * @param map ユーザ属性情報
	 */
	SessionUser(final String uid, final Map<String, String> map) {
		this.id = uid;
		this.attribute.putAll(map);
	}

	/**
	 * ユーザID取得
	 *
	 * @return ユーザID
	 */
	public String getUid() {
		return this.id;
	}

	/**
	 * ユーザ属性情報取得
	 * @param key キー
	 * @return ユーザ属性情報
	 */
	public String getAttribute(final String key) {
		return this.attribute.get(key);
	}

	/**
	 * ユーザ属性情報取得
	 * @return ユーザ属性情報
	 */
	public Map<String, String> getAttributeMap() {
		return Collections.unmodifiableMap(this.attribute);
	}

	/**
	 * ビルダー
	 *
	 * @author Tadashi Nakayama
	 * @version 1.0.0
	 */
	public static final class Builder {
		/** ユーザID */
		private final String id;
		/** ユーザ属性 */
		private final Map<String, String> attribute = new HashMap<>();

		/**
		 * コンストラクタ
		 * @param val uid
		 */
		public Builder(final String val) {
			this.id = val;
		}

		/**
		 * ビルド
		 *
		 * @return SessionUser
		 */
		public SessionUser build() {
			return new SessionUser(this.getId(), this.getAttributeMap());
		}

		/**
		 * 属性設定
		 * @param key 名前
		 * @param val 値
		 * @return ビルダー
		 */
		public Builder setAttribute(final String key, final String val) {
			this.attribute.put(key + "Login", val);
			return this;
		}

		/**
		 * ユーザID取得
		 *
		 * @return ユーザID
		 */
		String getId() {
			return this.id;
		}

		/**
		 * 属性取得
		 * @return 属性
		 */
		Map<String, String> getAttributeMap() {
			return this.attribute;
		}
	}
}
